package com.qixin.activiti.service.impl;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qixin.activiti.service.IEaLoanbillBXNCItfService;
import com.qixin.activiti.utils.EaListenerUtil;
import com.qixin.modules.ea.service.IEaBookDetailService;
import com.qixin.modules.ea.service.IEaCommunicationsService;
import com.qixin.modules.eaLoan.entity.EaLoanbill;
import com.qixin.modules.eaLoan.service.IEaLoanbillService;
import com.qixin.modules.log.entity.SysInterfaceLog;
import com.qixin.modules.log.service.ISysInterfaceLogService;
import com.qixin.modules.rzInvoice.service.IEaBillService;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.delegate.TaskListener;
import org.jeecg.common.nc.enums.WSEnum;
import org.jeecg.common.nc.service.NCWebService;
import org.jeecg.common.nc.vo.WSVO;
import org.jeecg.common.util.SpringContextUtils;
import org.jeecg.modules.activiti.entity.ActBusiness;
import org.jeecg.modules.activiti.entity.ActZTask;
import org.jeecg.modules.activiti.service.IActZTaskService;
import org.jeecg.modules.activiti.service.Impl.ActBusinessServiceImpl;
import org.jeecg.modules.nc.service.INcBdPsnjobService;
import org.jeecg.modules.system.service.ISysDictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.List;

/***
* @Description: 通讯费报销推送NC报销审核通过接口
* @author: CYS
* @date: 2022/3/15 11:16
*/
@Slf4j
@Service
public class EaLoanbillBXNCItfServiceImpl implements IEaLoanbillBXNCItfService {


    @Autowired
    private IEaLoanbillService iEaLoanbillService;
    @Autowired
    private IActZTaskService iActZTaskService;

    @Value(value = "${qixin.ncserver.uri}")
    private  String nCUrl;


    @Override
    public SysInterfaceLog bXApprove(ActBusiness actBusiness, String billNo) throws Exception {
        SysInterfaceLog sysInterfaceLog = new SysInterfaceLog();
        sysInterfaceLog.setBusinessNo(billNo);



            //查询借款单报销头
            EaLoanbill eaLoanbill = iEaLoanbillService.getById(actBusiness.getTableId());
            if(null==eaLoanbill){
                throw new RuntimeException("根据"+actBusiness.getTableId()+"TableId查询借款单空！");
            }
            EaListenerUtil.objectDefault(eaLoanbill,EaLoanbill.class);


            /*
            进入start相关事件调用WSDL在做处理
             */


                JSONObject jsonObject = new JSONObject();


                try {

                    //表头表体承载对象
                    JSONObject jsonHead = new JSONObject();

                    //根据表id查询任务记录最后审批人
                    ActZTask actZTask = iActZTaskService.getActZTaskByTableId(actBusiness.getProcInstId());

                    String userId = null;
                    int i = 0;
                    while (true){
                        i++;
                        userId = iActZTaskService.getActHiIdentitylinkById(actZTask.getProcInstId(), actZTask.getTaskId());

                        if(StrUtil.isNotEmpty(userId) || i==100){
                            break;
                        }
                        Thread.sleep(3000);
                    }
                    if(StrUtil.isEmpty(userId)){
                        throw new RuntimeException("根据表id查询任务记录最后审批人失败！");
                    }


                    /*
                    表头封装
                     */
                    jsonHead.put("bbje",eaLoanbill.getLoanAmount());
                    //币种=人民币-币种主键，直接取人民币主键
                    jsonHead.put("bzbm","1002Z0100000000001K1");
                    //冲借款本币金额=  -金额为0  否
                    jsonHead.put("cjkbbje","0");
                    //冲借款原币金额
                    jsonHead.put("cjkybje","0");
                    //创建人=创建人-用户主键
                    jsonHead.put("creator",eaLoanbill.getCreateBy());
                    //原报销人部门=报销人部门-组织_部门
                    jsonHead.put("deptid",eaLoanbill.getDeptId());
                    //报销人部门=报销人部门-组织_部门版本信息
                    jsonHead.put("deptid_v",eaLoanbill.getDeptId());
                    //单据编号=单据编号
                    jsonHead.put("djbh",eaLoanbill.getBillNo());
                    //单据大类=bx-bx
                    jsonHead.put("djdl","jk");
                    //单据类型编码=263X-Cxx-jk-借款单:263X-Cxx-jk
                    jsonHead.put("djlxbm","263X-Cxx-jk");
                    //单据日期=单据日期-2021-12-15 09:32:43
                    jsonHead.put("djrq", DateUtil.format(eaLoanbill.getBillDate(),"yyyy-MM-dd HH:mm:ss") );
                    //单据状态=3-0=暂存，1=保存，2=审核，3=签字，-1=作废，
                    jsonHead.put("djzt",eaLoanbill.getState());
                    //原费用承担单位=费用承担单位-组织
                    jsonHead.put("fydwbm",eaLoanbill.getCostCompCodeId());
                    //费用承担单位=费用承担单位-组织_版本信息
                    jsonHead.put("fydwbm_v",eaLoanbill.getCostCompCodeId());
                    //删除标志=0
                    jsonHead.put("dr","0");
                    //本币汇率=默认为1
                    jsonHead.put("bbhl","1");
                    //原报销人单位=//原报销人单位
                    jsonHead.put("dwbm",eaLoanbill.getCompanyCodeId());
                    //报销人单位=报销人单位
                    jsonHead.put("dwbm_v",eaLoanbill.getCompanyCodeId());
                    //附件张数=附件张数   否
                    jsonHead.put("fjzs","0");
                    //原费用承担部门=费用承担部门-组织_部门
                    jsonHead.put("fydeptid",eaLoanbill.getCostDept());
                    //费用承担部门=费用承担部门-组织_部门版本信息
                    jsonHead.put("fydeptid_v",eaLoanbill.getCostDept());
                    //供应商=供应商-收款对象为供应商，供应商必填  否
                    jsonHead.put("hbbm","");
                    //还款本币金额=  -金额为0
                    jsonHead.put("hkbbje","0");
                    //还款金额=  -金额为0
                    jsonHead.put("hkybje","0");
                    //报销人=报销人
                    jsonHead.put("jkbxr",eaLoanbill.getPersonId());
                    jsonHead.put("jsfs","");
                    //签字日期=最后审核人审核日期
                    jsonHead.put("jsr",actZTask.getOwnerId());
                    //会计年度=单据日期年度
                    jsonHead.put("kjnd",DateUtil.year(new DateTime()));
                    //会计期间=单据日期月份
                    jsonHead.put("kjqj",DateUtil.month(new DateTime()));
                    //录入人=录入人-用户主键
                    jsonHead.put("operator",eaLoanbill.getCreateBy());
                    //支付状态=3-3=支付完成
                    jsonHead.put("payflag","3");
                    //支付人=最后审批人(财务)
                    jsonHead.put("payman",actZTask.getOwnerId());
                    //收款对象=收款对象-0=员工，1=供应商，2=客户，
                    jsonHead.put("paytarget","0");
                    //pk_billtype=264X-264X
                    jsonHead.put("pk_billtype","263X");
                    //集团=集团
                    jsonHead.put("pk_group","0001A110000000000CLJ");
                    //财务组织=费用承担单位
                    jsonHead.put("pk_fiorg",eaLoanbill.getCostCompCodeId());
                    //借款报销单标识 =主表主键
                    jsonHead.put("pk_jkbx","");
                    //原报销单位=费用承担单位
                    jsonHead.put("pk_org",eaLoanbill.getCostCompCodeId());
                    //报销单位=费用承担单位
                    jsonHead.put("pk_org_v",eaLoanbill.getCostCompCodeId());
                    //原付款单位=费用承担单位
                    jsonHead.put("pk_payorg",eaLoanbill.getCostCompCodeId());
                    //付款单位=费用承担单位
                    jsonHead.put("pk_payorg_v",eaLoanbill.getCostCompCodeId());
                    //交易类型=NC交易类型主键
                    jsonHead.put("pk_tradetypeid","");
                    //收款人=收款人-收款对象为员工，收款人必填
                    jsonHead.put("receiver",eaLoanbill.getReceiver());
                    //审批状态=审批通过-0=审批未通过，1=审批通过，2=审批进行中，3=提交，-1=自由，
                    jsonHead.put("spzt","-1");
                    //生效标志=1-0=未生效，1=已生效，
                    jsonHead.put("sxbz","0");
                    //合计金额=实际付款金额
                    jsonHead.put("total",eaLoanbill.getLoanAmount());
                    //原币金额=实际付款金额
                    jsonHead.put("ybje",eaLoanbill.getLoanAmount());
                    //原币金额=实际付款金额
                    jsonHead.put("ybye",eaLoanbill.getLoanAmount());
                    //审批人=最后审批人(财务)-用户主键
                    jsonHead.put("approver",actZTask.getOwnerId());
                    jsonHead.put("zfbbje",eaLoanbill.getLoanAmount());
                    //支付原币金额 =实际付款金额
                    jsonHead.put("zfybje",eaLoanbill.getLoanAmount());
                    //事由=事由
                    jsonHead.put("zy","");
                    //收支项目=费用项目
                    jsonHead.put("szxmid",eaLoanbill.getIndexId());
                    jsonHead.put("actionCode", "APPROVE" + userId);

                    jsonObject.put("head",jsonHead);
                    /*
                    表头封装结束
                     */


                    /*
                    表体封装
                     */
                    JSONArray jsonArrayBody = new JSONArray();

                    JSONObject jsonBody = new JSONObject();
                    //合计金额=实际报销金额
                    jsonBody.put("amount",eaLoanbill.getLoanAmount());
                    //报销本币金额=实际付款金额
                    jsonBody.put("bbje",eaLoanbill.getLoanAmount());
                    jsonBody.put("bbye", eaLoanbill.getLoanAmount());
                    //原币金额=实际付款金额
                    jsonBody.put("ybje",eaLoanbill.getLoanAmount());
                    //原币金额=实际付款金额
                    jsonBody.put("ybye", eaLoanbill.getLoanAmount());
                    //删除标志=0
                    jsonBody.put("dr", "0");
                    //报销单业务行标识=子表主键
                    jsonBody.put("pk_busitem", "");
                    //借款报销单标识 =主表主键
                    jsonBody.put("pk_jkbx", "");
                    //行号=行号-n
                    jsonBody.put("rowno", "1");
                    jsonBody.put("szxmid",eaLoanbill.getIndexId());
                    //支付本币金额 =实际付款金额
                    jsonBody.put("zfbbje", eaLoanbill.getLoanAmount());
                    //支付金额=实际报销金额
                    jsonBody.put("zfybje",  eaLoanbill.getLoanAmount());
                    jsonArrayBody.add(jsonBody);

                    jsonObject.put("body",jsonArrayBody);
                    /*
                    表体封装结束
                     */

                    //调用WSDL
                    WSVO wsvo = NCWebService.sendToWS(nCUrl, WSEnum.BORROWMONEYBILL, jsonObject.toJSONString());

                    //日志保存
                    if(!wsvo.getStatus()){
                        throw new RuntimeException(wsvo.getMessage());
                    }
                    sysInterfaceLog.setState("1");
                    sysInterfaceLog.setDisposeState("0");
                    sysInterfaceLog.setResult(wsvo.getMessage());
                } catch (Exception e) {
                    sysInterfaceLog.setState("0");
                    sysInterfaceLog.setDisposeState("1");
                    sysInterfaceLog.setResult(e.getMessage());
                }
        sysInterfaceLog.setContent(jsonObject.toJSONString());
        sysInterfaceLog.setCreateTime(new DateTime());
        return sysInterfaceLog;
    }





}
